package doing.doing_501_1000;

import org.junit.Test;

import static com.study.util.LogUtil.info;
import static java.lang.Math.ceil;
import static java.lang.Math.max;
import static java.util.Arrays.sort;

/**
 * 908. Smallest Range I 最小差值 I
 * <p>
 * 给定一个整数数组 A，对于每个整数 A[i]，我们可以选择
 * 任意 x 满足 -K <= x <= K，并将 x 加到 A[i] 中。
 * 在此过程之后，我们得到一些数组 B。返回 B 的最大值和
 * B 的最小值之间可能存在的最小差值。
 * <p>
 * 示例 1：
 * 输入：A = [1], K = 0
 * 输出：0
 * 解释：B = [1]
 * 示例 2：
 * 输入：A = [0,10], K = 2
 * 输出：6
 * 解释：B = [2,8]
 * 示例 3：
 * 输入：A = [1,3,6], K = 3
 * 输出：0
 * 解释：B = [3,3,3] 或 B = [4,4,4]
 *
 * @author 大硕
 * 2019-04-12 6:51 AM
 **/
@SuppressWarnings("all")
public class SmallestRangeI {

    public int smallestRangeI(int[] A, int K) {
        if (A.length <= 1)
            return 0;

        sort(A);

        float num = A[A.length - 1] - A[0];

        if (K < ceil(num / 2)) {
            return max((int) (num - 2 * K), 0);
        } else {
            return 0;
        }
    }

    @Test
    public void test() {
//        int[] A = new int[]{1, 3, 6};
//        int K = 3;
//        info(smallestRangeI(A ,K));

        int[] A = new int[]{0, 10};
        int K = 2;
        info(smallestRangeI(A, K));
    }
}


































































/*
public int smallestRangeI(int[] A, int K) {
    if (A.length <= 1)
        return 0;

    sort(A);

    float num = A[A.length - 1] - A[0];

    if (K < Math.ceil(num / 2)) {
        return (int) (num - 2 * K > 0 ? num - 2 * K : 0);
    } else {
        return 0;
    }
}
*/
